import database from '../../utils/database'
import bcrypt from 'bcrypt';
// 数据库中用户表的表名
const tableName = 'users';
// 定义用户信息接口
interface UserInfo {
    id: number;
    username: string;
    role: 'normal' | 'admin';
}
// 用户服务类
export class UsersService {
    // 登录方法
    login(username: string, password: string): Promise<UserInfo> {
        return new Promise((res, rej) => {
            // 读取数据库用户数据
            database.queryData(
                tableName,
                ['id', 'username', 'role', 'password'],
                `username = '${username}'`,
                (data) => {
                    // DB 返回的是数组，直接取其中一个即可(只有一个元素)
                    let result = data.result.pop();
                    
                    // 如果用户数据存在，则进行后续验证
                    if (result != null) {
                        let p = result.password;
                        // 验证密码
                        let success = bcrypt.compareSync(password, p);
                        if (success) {
                            // 登录成功，返回用户数据
                            res({
                                id: result.id,
                                username: result.username,
                                role: result.role
                            });
                        } else {
                            rej('密码错误，请重新输入');
                        }
                    } else {
                        rej('请输入正确的账户信息');
                    }
                }
            );
        });
    }
    // 注册方法
    signUp(username: string, password: string, role: string): Promise<null> {
        return new Promise((res, rej) => {
            // 检查是否已经有用户存在
            database.queryData(
                tableName,
                ['id'],
                `username = '${username}'`,
                (data) => {
                    let result = data.result.pop();
                    // 如果用户已经存在，则不能重复注册
                    if (result != null) {
                        rej('用户名已存在，请更换其他用户名注册');
                    } else {
                        // 对密码进行加密
                        let crypt = bcrypt.hashSync(password, 10);
                        // 将密码加密后的用户数据存储到数据库中
                        database.insertData(
                            tableName,
                            ['username', 'password', 'role'],
                            [username, crypt, role],
                            data => {
                                if (data) {
                                    res(null);
                                } else {
                                    rej('注册失败，请稍后重试');
                                }
                            }
                        );
                    }
                }
            );
        });
    }
}
// 导出服务类
export default new UsersService();
    